home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / pcd2_126 / pcd2_126.lzh / PCD_PF.HAS < prev    next >
Text File  |  1997-08-26  |  16KB  |  887 lines

  1. **************************************************
  2. * PhotoCD Portfolioに対応部分
  3. *
  4. * 著作権はFa.Tom氏と同じく可能な限り放棄
  5. * 改造等は、貴方の良心に従って下さい
  6. * 実行形式・ソース共、利用に制限はありませんが
  7. * 無保証であることだけは保証します
  8. *                 by まる丸 1997
  9. **************************************************
  10.  
  11.  
  12. *------------------------------
  13. * インクルード&外部参照
  14. *------------------------------
  15.     .include    doscall.mac
  16.     .include    iocscall.mac
  17.  
  18.     .xref    Fsize,Fname
  19.     .xref    PCD_MAIN
  20.     .xref    V_FLAME,GA_wipe,FLG_WP
  21.     .xref    IMAGE_NUM,SW_S,SW_LX,SW_LY,SW_PF,FLG_V,SW_P
  22.     .xref    MS_INIT,MS_CHECK,MScsrON,MScsrOFF,limitB,G_MODE,get_num,FLG_MS,MS_Lcl
  23.     .xdef    PF_PLAY,K_Clear,PlayAudioMSF
  24.     .xdef    KEY_DATA,key_chk,Wipe
  25.     .xdef    M_TBL_X,M_TBL_Y,M_TBL_J
  26.     .xdef    Now,TimeOut,SEL,MN_FLG,W_Time,time_clr,time_get,num2jp
  27.  
  28. *------------------------------
  29. * プログラム部
  30. *------------------------------
  31.     .cpu    68000
  32.     .text
  33.     .align    4
  34.  
  35. *------------------------------
  36. * ファイル名を調べ
  37. * PLAYLIST.PCDならPortfolio再生
  38. *------------------------------
  39. PF_PLAY:
  40.     movem.l    d2-d5/a0/a5,-(sp)
  41.     move.w    IMAGE_NUM,d2
  42.     move.w    SW_LX,d3
  43.     move.w    SW_LY,d4
  44.     move.w    d0,FHdl
  45.     lea.l    FNAME1,a0
  46.     bsr    namechek
  47.     tst.b    d0
  48.     bne    @f
  49.     st.b    SW_PF
  50.     bsr    PF_INIT
  51.     tst.l    d0
  52.     bmi    PF_exit
  53.     bsr    PF_MAIN
  54.     bsr    PF_END
  55.     bra    PF_exit
  56. @@:    moveq.l    #1,d0
  57. PF_exit:
  58.     move.w    d2,IMAGE_NUM
  59.     move.w    d3,SW_LX
  60.     move.w    d4,SW_LY
  61.     cmpi.b    #2,d2
  62.     beq    @f
  63.     clr.b    FLG_WP
  64. @@:    clr.b    SW_PF
  65.     bsr    K_Clear        *キーバッファクリア
  66.     movem.l    (sp)+,d2-d5/a0/a5
  67.     rts
  68.  
  69. *------------------------------
  70. * 初期設定
  71. *------------------------------
  72. PF_INIT:
  73.     movem.l    d3,-(sp)
  74.     move.l    Fsize,-(sp)    *PLAYLIST.PCDを
  75.     DOS    _MALLOC        *読み込むメモリ
  76.     addq.l    #4,sp        *を確保
  77.     tst.l    d0
  78.     bmi    mem_err_exit
  79.     move.l    d0,a5
  80.     move.l    Fsize,-(sp)    *PLAYLIST.PCDを
  81.     move.l    d0,-(sp)    *読み込み
  82.     move.w    FHdl,-(sp)
  83.     DOS    _READ
  84.     lea    10(sp),sp
  85.     tst.l    d0
  86.     bmi    re_err_exit    *エラーならリターン
  87.     cmp.l    Fsize,d0    *エラーが出なくても
  88.     beq    1f        *正しく読み込めない
  89.     tst.b    SW_P        *場合が有るので
  90.     bne    1f        * -Pで処理を振り分ける
  91.     moveq.l    #-6,d3
  92.     bra    2f
  93. 1:    bsr    l_space        *画像の表示位置決定
  94.     bsr    MS_INIT
  95.     clr.l    d5        *PLAYLIST.PCDの最初
  96.     clr.l    d0        *初期設定正常
  97.     movem.l    (sp)+,d3
  98.     rts
  99. re_err_exit:
  100.     moveq.l    #-1,d3
  101. 2:    move.l    a5,-(sp)
  102.     DOS    _MFREE
  103.     addq.l    #4,sp
  104.     move.l    d3,d0
  105.     movem.l    (sp)+,d3
  106.     rts
  107. mem_err_exit:
  108.     move.l    #-3,d0
  109.     movem.l    (sp)+,d3
  110.     rts
  111.  
  112. *------------------------------
  113. * PhotoCD Portfolioの再生
  114. *    PLAYLIST.PCDの内容を
  115. *    0(a5,d5) でアクセス
  116. *------------------------------
  117. PF_MAIN:
  118.     movem.l    d7/a6,-(sp)
  119. m_loop:    move.l    d5,d7
  120.     bsr    get_word
  121.     lea.l    (menu_sub),a6
  122.     cmpi.w    #$1000,d0
  123.     beq    @f
  124.     lea.l    (play_sub),a6
  125.     cmpi.w    #$2000,d0
  126.     bne    1f
  127. @@:    jsr    (a6)
  128.     tst.l    d0
  129.     bmi    2f
  130.     move.l    d0,d5
  131.     bra    m_loop
  132. 1:    move.l    #-5,d0        *ファイルが変
  133.     bra    @f
  134. 2:    cmpi.w    #-6,d0        *正常終了か
  135.     bne    @f        *異状ならそのまま
  136.     clr.l    d0        *正常終了なら 0を返す
  137. @@:    movem.l    (sp)+,d7/a6
  138.     rts
  139.  
  140. *------------------------------
  141. * 後片付け
  142. *------------------------------
  143. PF_END:
  144.     movem.l    d0,-(sp)
  145.     move.l    a5,-(sp)
  146.     DOS    _MFREE
  147.     addq.l    #4,sp
  148.  
  149. *    move.l    S_MM,E_MM    *SUSIE対策2
  150. *    bsr    PlayAudioMSF    *演奏停止
  151.  
  152.     pea.l    PAN        *ダミー
  153.     move.w    #$8003,-(sp)    *コマンド番号(停止)
  154.     clr.w    -(sp)        *カレントドライブ
  155.     move.w    #13,-(sp)
  156.     DOS    _IOCTRL        *ドライバコール
  157.     lea.l    10(sp),sp
  158.  
  159.     movem.l    (sp)+,d0
  160.     rts
  161.  
  162. *------------------------------
  163. * メニューの処理
  164. *------------------------------
  165. menu_sub:
  166.     movem.l    d1-d6/a0,-(sp)
  167.     st.b    MN_FLG
  168.     move.l    d7,Now
  169.     bsr    get_byte
  170.     clr.w    d6
  171.     cmpi.b    #100,d0
  172.     bcs    @f
  173.     move.b    #99,d0
  174. @@:    move.b    d0,d6        *選択肢の数
  175.     move.w    d6,SEL
  176.     moveq.l    #3,d1
  177.     lea.l    Previous,a0
  178. @@:    bsr    get_long
  179.     move.l    d0,(a0)+
  180.     dbra    d1,@b
  181.     move.l    d7,MenuErr    *メニューエラーの処理を潰す
  182. @@:    bsr    get_word    *大量の0000とFFFFを
  183.     tst.w    d0        *スキップ
  184.     ble    @b
  185.     clr.b    MU_FLG
  186.     bsr    pic_audio    *画像と音声
  187.     add.l    #24,d5
  188.     tst.l    AUDIO_BUF    *音声の再生が有るか
  189.     bne    @f
  190.     add.l    #28,d5        *無ければ音声データ分スキップ
  191. @@:    move.l    d5,d4
  192. 3:    clr.b    PA_FLG
  193.     bsr    make_select    *選択肢のテーブルを作成
  194.     bsr    disp_pcd    *d1.lに待ち時間
  195.     bsr    time_clr
  196.     tst.w    KEY_DATA
  197.     bge    1f
  198.     moveq.l    #0,d1
  199. 1:    tst.l    d0
  200.     bmi    2f
  201.     st    (FLG_V)
  202.     bsr    MScsrON
  203. *    move.l    d1,-(sp)
  204.     moveq.l    #0,d0
  205.     bsr    wait
  206. *    move.l    (sp)+,d1
  207.  
  208.     move.l    d0,-(sp)
  209.     bsr    time_get
  210.     cmp.l    d0,d1
  211.     bge    9f
  212.     moveq.l    #0,d1
  213. 9:    move.l    (sp)+,d0
  214.  
  215.     cmpi.b    #204,d0
  216.     bne    @f
  217.     bsr    MScsrOFF
  218.     bsr    K_Clear        *キーバッファクリア
  219.     bsr    resize
  220.     move.l    W_Time,d1
  221.     bra    3b
  222. @@:    tst.b    PA_FLG        *一時停止中か?
  223.     beq    @f
  224.     tst.b    MS_Lcl        *左クリックされたか?
  225.     bne    @f
  226.     tst.b    d0        *キーが押すされたか?意味の有るクリックか? 
  227.     bne    @f
  228.     move.b    #203,d0
  229. @@:    cmpi.b    #203,d0        *スペースキーなら
  230.     bne    @f
  231.     st.b    PA_FLG        *一時停止されたフラグ
  232.     moveq.l    #0,d1        *待時間をゼロにする
  233.  
  234. @@:    move.l    TimeOut,d2
  235.     tst.w    d0
  236.     bne    9f
  237.     tst.l    d1
  238.     beq    @f
  239.     bra    1b
  240. 9:    bsr    num2jp
  241.     move.l    d0,d2
  242. @@:    move.l    d2,d0
  243.     cmp.l    d7,d0
  244.     bne    2f
  245.     tst.b    SW_S
  246.     beq    @f
  247.     cmpi.w    #2,IMAGE_NUM
  248.     beq    2f
  249. @@:    tst.b    MU_FLG
  250.     beq    4f
  251.     tst.l    d1
  252.     bne    @f
  253.     tst.b    PA_FLG
  254.     bne    @f
  255. 4:    bsr    PlayAudioMSF
  256.     move.l    W_Time,d1
  257. @@:    clr.l    d0
  258.     bra    1b
  259. 2:    bsr    MScsrOFF
  260.     bsr    K_Clear        *キーバッファクリア
  261.     movem.l    (sp)+,d1-d6/a0
  262.     rts
  263.  
  264. make_select:
  265.     movem.l    d0-d2/a0-a1,-(sp)
  266.     move.l    d4,d5
  267.     move.w    SEL,d1
  268.     subq.w    #1,d1
  269.     move.l    d1,d2
  270.     lea.l    M_TBL_J,a0
  271. @@:    bsr    get_long
  272.     move.l    d0,(a0)+
  273.     dbra    d2,@b
  274.     lea.l    M_TBL_X,a0
  275.     lea.l    M_TBL_Y,a1
  276. @@:    bsr    get_byte
  277.     bsr    henkanx
  278.     move.w    d0,(a0)+
  279.     bsr    get_byte
  280.     bsr    henkany
  281.     move.w    d0,(a1)+
  282.     bsr    get_byte
  283.     bsr    henkanx
  284.     move.w    d0,(a0)+
  285.     bsr    get_byte
  286.     bsr    henkany
  287.     move.w    d0,(a1)+
  288.     dbra    d1,@b
  289.     movem.l    (sp)+,d0-d2/a0-a1
  290.     rts
  291.  
  292. henkanx:
  293.     movem.l    d1,-(sp)
  294.     moveq.l    #0,d1
  295.     move.b    d0,d1
  296.     tst.b    G_MODE
  297.     bne    1f
  298.     tst.w    IMAGE_NUM
  299.     bne    @f
  300.     lsr.w    #1,d1
  301.     bra    2f
  302. @@:    cmpi.w    #1,IMAGE_NUM
  303.     beq    2f
  304.     add.w    d1,d1
  305.     bra    2f
  306. 1:    move.w    d1,d0
  307.     add.w    d1,d1
  308.     add.w    d0,d1
  309.     cmpi.w    #2,IMAGE_NUM
  310.     beq    2f
  311.     lsr.w    #1,d1
  312.     tst.w    IMAGE_NUM
  313.     bne    2f
  314.     lsr.w    #1,d1
  315. 2:    add.w    limitB,d1
  316.     add.w    SW_LX,d1
  317.     move.w    d1,d0
  318.     movem.l    (sp)+,d1
  319.     rts
  320.     
  321. henkany:
  322.     movem.l    d1,-(sp)
  323.     moveq.l    #0,d1
  324.     move.b    d0,d1
  325.     tst.w    IMAGE_NUM
  326.     bne    @f
  327.     lsr.w    #1,d1
  328.     bra    1f
  329. @@:    cmpi.w    #1,IMAGE_NUM
  330.     beq    1f
  331.     add.w    d1,d1
  332. 1:    add.w    SW_LY,d1
  333.     move.w    d1,d0
  334.     movem.l    (sp)+,d1
  335.     rts
  336.  
  337. num2jp:
  338.     movem.l    d2/a0,-(sp)
  339.     moveq.l    #0,d2
  340.     cmpi.b    #200,d0
  341.     beq    @f
  342.     move.l    Previous,d2
  343.     cmpi.b    #201,d0
  344.     beq    @f
  345.     move.l    Next,d2
  346.     cmpi.b    #202,d0
  347.     beq    @f
  348.     move.l    Now,d2
  349.     cmpi.b    #203,d0
  350.     beq    @f
  351.     move.l    #-4,d2
  352.     cmpi.b    #206,d0
  353.     beq    1f
  354.     move.l    #-6,d2
  355.     cmpi.b    #207,d0
  356.     beq    1f
  357.     move.l    MenuErr,d2
  358.     cmp.w    SEL,d0
  359.     bhi    @f
  360.     lea.l    M_TBL_J,a0
  361.     subq.b    #1,d0
  362.     add.w    d0,d0
  363.     add.w    d0,d0
  364.     move.l    0(a0,d0.w),d2
  365. @@:    tst.l    d2
  366.     bge    1f
  367.     move.l    Now,d2
  368. 1:    move.l    d2,d0
  369.     movem.l    (sp)+,d2/a0
  370.     rts
  371.  
  372. *------------------------------
  373. * 連続再生の処理
  374. *------------------------------
  375. play_sub:
  376.     movem.l    d1/d3-d6,-(sp)
  377.     clr.b    MN_FLG
  378.     move.l    d7,Now
  379.     bsr    get_byte
  380.     clr.w    d6
  381.     move.b    d0,d6        *フレーム数
  382.     bsr    get_long    *このデータ不明
  383.     bsr    get_long
  384.     tst.l    d0
  385.     bge    @f
  386.     move.l    d7,d0
  387. @@:    move.l    d0,Previous
  388.     bsr    get_long
  389.     tst.l    d0
  390.     bge    @f
  391.     move.l    d7,d0
  392. @@:    move.l    d0,Next
  393.     add.l    #25,d5        *意味の無いデータをスキップ
  394.     subq.b    #1,d6
  395. 1:    bsr    get_long
  396.     move.l    d5,d4        *PUSH
  397.     move.l    d0,d5
  398.     bsr    get_word
  399.     bsr    pic_audio    *画像と音声
  400. 2:    bsr    disp_pcd
  401.     tst.l    d0
  402.     bmi    4f
  403.     st    (FLG_V)
  404.     move.l    W_Time,d0
  405.     bsr    wait
  406. @@:    cmpi.b    #203,d0        *スペースなら
  407.     bne    @f
  408. 9:    bsr    MS_CHECK    *マウスが押されるか
  409.     tst.w    d0
  410.     bne    @f
  411.     IOCS    _B_KEYSNS    *他のキーが
  412.     tst.l    d0
  413.     beq    9b
  414.     IOCS    _B_KEYINP    *押されるまで
  415.     bsr    key_chk
  416.     bra    @b        *ループ
  417. @@:    cmpi.b    #204,d0
  418.     bne    @f
  419.     bsr    resize
  420.     bra    2b
  421. @@:    moveq.l    #0,d3
  422.     cmpi.b    #200,d0
  423.     beq    3f
  424.     move.l    Previous,d3
  425.     cmpi.b    #201,d0
  426.     beq    3f
  427.     cmpi.b    #202,d0
  428.     beq    @f
  429.     move.l    #-4,d3
  430.     cmpi.b    #206,d0
  431.     beq    3f
  432.     move.l    #-6,d3
  433.     cmpi.b    #207,d0
  434.     beq    3f
  435.     move.l    d4,d5        *POP
  436.     dbra    d6,1b
  437. @@:    move.l    Next,d3
  438. 3:    move.l    d3,d0
  439. 4:    movem.l    (sp)+,d1/d3-d6
  440.     rts
  441.  
  442. *------------------------------
  443. * 画像サイズ変更
  444. *------------------------------
  445. resize:
  446.     addq.w    #1,IMAGE_NUM
  447.     cmpi.w    #2,IMAGE_NUM
  448.     bls    @f
  449.     clr.w    IMAGE_NUM
  450.     bsr    Wipe
  451. @@:    bsr    l_space
  452. *    bsr    disp_pcd
  453.     rts
  454.  
  455. *------------------------------
  456. * 画面消去
  457. *------------------------------
  458. Wipe:
  459.     st.b    FLG_WP
  460.     tst.l    V_FLAME
  461.     bge    @f
  462.     tst.b    SW_S
  463.     bne    1f
  464.     movem.l    d0-d1,-(sp)
  465.     IOCS    _WIPE
  466.     movem.l    (sp)+,d0-d1
  467. 1:    rts
  468. @@:    bsr    GA_wipe
  469.     rts
  470.  
  471. *------------------------------
  472. * 画像の表示位置決定
  473. *------------------------------
  474. l_space:
  475.     movem.l    d0-d1/a0,-(sp)
  476.     lea.l    XY_SP,a0
  477.     move.w    IMAGE_NUM,d1
  478.     lsl.w    #1,d1
  479.     move.w    0(a0,d1.w),d0
  480.     move.w    d0,SW_LY
  481.     tst.l    V_FLAME
  482.     bmi    1f
  483.     move.w    12(a0,d1.w),d0
  484.     bra    @f
  485. 1:    tst.b    SW_S
  486.     beq    @f
  487.     move.w    6(a0,d1.w),d0
  488. @@:    move.w    d0,SW_LX
  489.     movem.l    (sp)+,d0-d1/a0
  490.     rts
  491.  
  492. *------------------------------
  493. * d0.lの時間キー入力を待つ
  494. *------------------------------
  495. wait:
  496.     movem.l    d1,-(sp)
  497.     move.l    d0,d1
  498.     clr.l    d0
  499.     move.w    KEY_DATA,d0
  500.     beq    @f
  501.     cmpi.w    #-1,d0
  502.     bne    2f
  503.     clr.l    d0
  504.     bra    2f
  505. @@:    tst.b    MN_FLG
  506.     bne    @f
  507.     bsr    time_clr
  508. @@:    IOCS    _B_KEYSNS
  509.     tst.l    d0
  510.     beq    1f
  511.     bsr    key_chk
  512.     tst.l    d0
  513.     bne    @f
  514.     bsr    K_Clear        *キーバッファクリア
  515. 1:    bsr    MS_CHECK
  516.     tst.l    d0
  517.     bne    2f
  518.     bsr    time_get
  519.     cmp.l    d1,d0
  520.     bcs    @b
  521.     clr.l    d0
  522.     bra    2f
  523. @@:    IOCS    _B_KEYINP
  524.     bsr    key_chk
  525. 2:    clr.w    KEY_DATA
  526.     tst.b    MN_FLG
  527.     bne    @f
  528.     bsr    K_Clear        *キーバッファクリア
  529. *    move.l    d0,-(sp)
  530. *    bsr    time_get
  531. *    sub.l    d0,d1
  532. *    bge    @f
  533. *    clr.l    d1
  534. @@:
  535. *    move.l    (sp)+,d0
  536.     movem.l    (sp)+,d1
  537.     rts
  538.  
  539. *------------------------------
  540. * キーバッファのクリア
  541. *------------------------------
  542. K_Clear:
  543.     movem.l    d0,-(sp)    *IOCSCALLを使うより
  544. @@    move.w    #6,-(sp)    *DOSCALLの方が確実に
  545.     move.w    #$ff,-(sp)    *バッファを消去
  546.     DOS    _KFLUSH        *出来るようだ
  547.     addq.l    #4,sp
  548.     tst.l    d0
  549.     bne    @b
  550.     movem.l    (sp)+,d0
  551.     rts
  552.  
  553. *------------------------------
  554. * B_KEYSNS B_KEYINPで得られた
  555. * d0.lを都合のいいように変換
  556. *------------------------------
  557. key_chk:
  558.     movem.l    d1-d2,-(sp)
  559.     move.b    d0,d2
  560.     lsr.w    #8,d0
  561.     moveq.l    #0,d1
  562.     move.w    #200,d1
  563.     cmpi.b    #$6*8+6,d0    * HOME
  564.     beq    @f
  565.     move.w    #201,d1
  566.     cmpi.b    #$7*8+1,d0    * ROLL DOWN
  567.     beq    @f
  568.     move.w    #202,d1
  569.     cmpi.b    #$7*8+0,d0    * ROLL UP
  570.     beq    @f
  571.     move.w    #203,d1
  572.     cmpi.b    #$6*8+5,d0    * SPACE
  573.     beq    @f
  574.     move.w    #204,d1
  575.     cmpi.b    #$7*8+2,d0    * UNDO
  576.     beq    @f
  577.     move.w    #205,d1
  578.     cmpi.b    #$a*8+4,d0    * HELP
  579.     beq    @f
  580.     move.w    #206,d1
  581.     cmpi.b    #$0*8+1,d0    * ESC
  582.     beq    @f
  583.     move.w    #207,d1
  584.     cmpi.b    #$3*8+5,d0    * CR
  585.     beq    @f
  586.     move.w    #207,d1
  587.     cmpi.b    #$9*8+6,d0    * ENTER
  588.     beq    @f
  589.     moveq.l    #0,d1
  590.     cmpi.b    #'0',d2
  591.     bls    @f
  592.     cmpi.b    #'9',d2
  593.     bhi    @f
  594.     move.b    d2,d1
  595.     andi.b    #$0f,d1
  596. @@:    move.l    d1,d0
  597.     movem.l    (sp)+,d1-d2
  598.     rts
  599.  
  600. *------------------------------
  601. * 絵を表示して音声データ再生
  602. *------------------------------
  603. pic_audio:
  604.     movem.l    d2-d4/a0,-(sp)    *d0.wに$3?01が入った状態
  605.     lea.l    AUDIO_BUF,a0
  606.     clr.l    d2        *待時間合計を入れる
  607.     bsr    get_word    *絵の番号
  608.     bsr    Name_set    *絵の表示準備
  609.     bsr    get_byte    *表示解像度か?表示可能解像度か?
  610.     bsr    get_byte    *待時間1(1/2秒)
  611.     move.b    d0,d2
  612.     add.l    #10,d5        *意味不明データをスキップ
  613.     bsr    get_byte
  614.     cmpi.b    #$40,d0        *音声データか?
  615.     bne    2f
  616.     clr.l    d0
  617.     moveq.l    #1,d1
  618. 0:    moveq.l    #2,d3
  619. 1:    bsr    get_byte
  620.     move.b    d0,d4        *10進データを16進数に変換
  621.     andi.b    #$0f,d4        * もっとスマートな方法が
  622.     lsr.b    #4,d0        * 有りそうなもんだが
  623.     mulu.w    #10,d0
  624.     add.b    d4,d0
  625.     move.b    d0,(a0)+    *MSFデータ書き込み
  626.     dbra    d3,1b
  627.     clr.b    (a0)+
  628.     dbra    d1,0b
  629.     clr.l    d0
  630.     move.b    E_MM,d0        *終了分を
  631.     sub.b    S_MM,d0        *開始分から引いて
  632.     mulu.w    #120,d0        *1/2秒に直して
  633.     add.l    d0,d2        *待時間に足す
  634.     clr.l    d0
  635.     move.b    E_SS,d0        *終了秒を
  636.     add.l    d0,d0        *2倍し
  637.     add.l    d0,d2        *待時間に足して
  638.     move.b    S_SS,d0        *開始秒を
  639.     add.l    d0,d0        *2倍して
  640.     sub.l    d0,d2        *待時間から引く
  641.     mulu.w    #50,d2        *50倍すると1/100秒
  642.     move.b    E_FF,d0        *終了フレーム(1/75秒)を
  643.     bsr    ff2bs        *1/100秒に変換
  644.     add.l    d0,d2        *待時間に足して
  645.     clr.l    d0
  646.     move.b    S_FF,d0        *開始フレームを
  647.     bsr    ff2bs        *1/100秒に変換
  648.     sub.l    d0,d2        *待時間合計から引く
  649.     clr.l    d0
  650.     bsr    get_byte    *待時間2(1/2秒)
  651.     mulu.w    #50,d0        *50倍(1/100秒)
  652.     add.l    d0,d2        *待時間合計に足す
  653.     add.l    #20,d5        *意味不明データをスキップ
  654.     bra    3f
  655. 2:    subq.l    #1,d5
  656.     clr.l    (a0)
  657.     mulu.w    #50,d2
  658. 3:    addq.l    #1,d2        *誤差補正の意味で +1
  659.     exg    d2,d1        *d1に待時間合計を返す(1/100)
  660.     move.l    d1,W_Time
  661. *    bsr    disp_pcd    *絵の表示+演奏
  662.     movem.l    (sp)+,d2-d4/a0
  663.     rts
  664.  
  665. *------------------------------
  666. * 1/75を1/100に変換
  667. *------------------------------
  668. ff2bs:
  669.     mulu.w    #100,d0        *100倍して
  670.     divu.w    #75,d0        *75で割れば
  671.     swap    d0        *1/100秒に
  672.     clr.w    d0        *なる
  673.     swap    d0
  674.     rts
  675.  
  676. *------------------------------
  677. * PLAYLIST.PCDの内容をd0に読む
  678. *------------------------------
  679. get_byte:
  680.     move.b    0(a5,d5.l),d0
  681.     addq.l    #1,d5
  682.     rts
  683.  
  684. get_word:
  685.     bsr    get_byte
  686.     lsl.w    #8,d0
  687.     bsr    get_byte
  688.     rts
  689.  
  690. get_long:
  691.     bsr    get_word
  692.     swap    d0
  693.     bsr    get_word
  694.     rts
  695.  
  696. *------------------------------
  697. * a0.l からの文字列と
  698. *    Fnameの比較
  699. *------------------------------
  700. namechek:
  701.     movem.l    a1,-(sp)
  702.     lea.l    Fname,a1
  703. @@:    move.b    (a0),d0
  704.     or.b    (a1),d0
  705.     cmp.b    (a0)+,(a1)+
  706.     bne    @f
  707.     tst.b    d0
  708.     bne    @b
  709. @@:    movem.l    (sp)+,a1
  710.     rts
  711.  
  712. *-------------------------------
  713. * オーディオトラック再生
  714. * CD-ROMドライバをコールするのみ
  715. *-------------------------------
  716. PlayAudioMSF:
  717.     tst.b    SW_PF        *Portforioモードか
  718.     beq    @f        *違ったらリターン
  719.     st.b    MU_FLG
  720.     tst.l    AUDIO_BUF    *音声データは有るか
  721.     beq    @f        *無かったらリターン
  722.     movem.l    d0,-(sp)
  723.     move.b    #3,PAN        *ステレオ
  724.     pea.l    PAN        *パンポット制御
  725.     move.w    #$8005,-(sp)    *コマンド番号
  726.     clr.w    -(sp)        *カレントドライブ
  727.     move.w    #13,-(sp)
  728.     DOS    _IOCTRL        *ドライバコール
  729.     lea.l    10(sp),sp
  730.     pea.l    AUDIO_BUF    *MSF再生
  731.     move.w    #$8001,-(sp)    *コマンド番号
  732.     clr.w    -(sp)        *カレントドライブ
  733.     move.w    #13,-(sp)
  734.     DOS    _IOCTRL        *ドライバコール
  735.     lea.l    10(sp),sp
  736.     movem.l    (sp)+,d0
  737. @@:    rts
  738.  
  739. *----------------------------------
  740. * time_clrからの時間を1/100秒で返す
  741. *----------------------------------
  742. time_get:
  743.     movem.l    d1,-(sp)
  744.     IOCS    _ONTIME
  745.     sub.l    time,d0
  746.     bge    @f
  747.     add.l    #8640000,d0
  748. @@:    movem.l    (sp)+,d1
  749.     rts
  750.  
  751. *------------------------------
  752. * タイマーの初期化
  753. *------------------------------
  754. time_clr:
  755.     movem.l    d0-d1,-(sp)
  756.     IOCS    _ONTIME
  757.     move.l    d0,time
  758.     movem.l    (sp)+,d0-d1
  759.     rts
  760.  
  761. *------------------------------
  762. * 絵の表示
  763. *------------------------------
  764. disp_pcd:
  765.     clr.w    -(sp)
  766.     pea.l    name_buff
  767.     DOS    _OPEN
  768.     addq.l    #6,sp
  769.     tst.l    d0
  770.     bmi    @f
  771.     move.w    d0,FHdl
  772.     bsr    PCD_MAIN
  773.     movem.l    d0,-(sp)
  774.     move.w    FHdl,-(sp)
  775.     DOS    _CLOSE
  776.     addq.l    #2,sp
  777.     movem.l    (sp)+,d0
  778.     rts
  779. @@:    move.l    #-1,d0
  780.     rts
  781.  
  782. *------------------------------
  783. * 入力 d0.w 絵の番号
  784. * 出力 name_buff
  785. *     表示するファイル名
  786. *------------------------------
  787. Name_set:
  788.     movem.l    d0-d1/a0-a1,-(sp)
  789.     lea.l    r_name,a0
  790.     lea.l    name_buff,a1
  791. @@:    move.b    (a0)+,(a1)+
  792.     bne    @b
  793.     subq.l    #1,a1
  794.     bsr    bin2asc
  795.     moveq.l    #3,d1
  796. @@:    move.b    d0,(a1)+
  797.     lsr.l    #8,d0
  798.     dbra    d1,@b
  799.     move.b    #'.',(a1)+
  800.     move.b    #'P',(a1)+
  801.     move.b    #'C',(a1)+
  802.     move.b    #'D',(a1)+
  803.     clr.b    (a1)
  804.     movem.l    (sp)+,d0-d1/a0-a1
  805.     rts
  806.  
  807. *------------------------------
  808. * d0.wの数値をASCIIコードに変換
  809. * d0.lへ  ただし順番が逆
  810. *------------------------------
  811. bin2asc:
  812.     movem.l    d1-d2,-(sp)
  813.     clr.l    d1
  814.     move.w    d0,d1
  815.     moveq.l    #3,d2
  816. @@:    lsl.l    #8,d0
  817.     divu.w    #10,d1
  818.     swap    d1
  819.     move.b    d1,d0
  820.     ori.b    #'0',d0
  821.     clr.w    d1
  822.     swap    d1
  823.     dbra    d2,@b
  824.     movem.l    (sp)+,d1-d2
  825.     rts
  826.  
  827. *------------------------------
  828. * 固定データ
  829. *------------------------------
  830.     .data
  831.     .align    4
  832. XY_SP:    .dc.w    192,128,0
  833.     .dc.w    160,64,0
  834.     .dc.w    288,192,0
  835. FNAME1:    .dc.b    'PLAYLIST.PCD',0
  836. r_name:    .dc.b    '\PHOTO_CD\IMAGES\IMG',0
  837.  
  838. *------------------------------
  839. * ワークエリア
  840. *------------------------------
  841.     .bss
  842.     .align    4
  843. name_buff:
  844.     .ds.b    32
  845. Now:
  846.     .ds.l    1
  847. Previous:
  848.     .ds.l    1
  849. Next:
  850.     .ds.l    1
  851. MenuErr:
  852.     .ds.l    1
  853. TimeOut:
  854.     .ds.l    1
  855. time:
  856.     .ds.l    1
  857. M_TBL_X:
  858.     .ds.l    99
  859. M_TBL_Y:
  860.     .ds.l    99
  861. M_TBL_J:
  862.     .ds.l    99
  863.  
  864. AUDIO_BUF:
  865. S_MM:    .ds.b    1
  866. S_SS:    .ds.b    1
  867. S_FF:    .ds.b    1
  868.     .ds.b    1
  869. E_MM:    .ds.b    1
  870. E_SS:    .ds.b    1
  871. E_FF:    .ds.b    1
  872.     .ds.b    1
  873.  
  874. FHdl:    .ds.w    1
  875.  
  876. W_Time:
  877.     .ds.l    1
  878. KEY_DATA:
  879.     .ds.w    1
  880. SEL:
  881.     .ds.w    1
  882.  
  883. PAN:    .ds.b    1
  884. MN_FLG:    .ds.b    1
  885. MU_FLG:    .ds.b    1
  886. PA_FLG:    .ds.b    1
  887.